/**********************************************************************\

 Copyright 2012 Diggory Blake

 This file is part of klip-engine

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.

\**********************************************************************/
#pragma once

#include "keblend.h"

struct kBlend {
public:
	keBlendFactor srcBlend;
	keBlendFactor dstBlend;
	keBlendOp blendOp;
	keBlendFactor srcBlendAlpha;
	keBlendFactor dstBlendAlpha;
	keBlendOp blendOpAlpha;

	inline kBlend() {
		srcBlend = keBlend_SrcAlpha;
		dstBlend = keBlend_InvSrcAlpha;
		blendOp = keBlend_Add;
		srcBlendAlpha = keBlend_One;
		dstBlendAlpha = keBlend_One;
		blendOpAlpha = keBlend_Add;
	}
	inline kBlend(keBlendFactor src, keBlendOp op, keBlendFactor dst) {
		srcBlend = src;
		dstBlend = dst;
		blendOp = op;
		srcBlendAlpha = src;
		dstBlendAlpha = dst;
		blendOpAlpha = op;
	}
	inline kBlend(keBlendFactor src, keBlendOp op, keBlendFactor dst, keBlendFactor srcAlpha, keBlendOp opAlpha, keBlendFactor dstAlpha) {
		srcBlend = src;
		dstBlend = dst;
		blendOp = op;
		srcBlendAlpha = srcAlpha;
		dstBlendAlpha = dstAlpha;
		blendOpAlpha = opAlpha;
	}

	inline bool operator==(const kBlend& other) {
		return (srcBlend == other.srcBlend)
			&& (dstBlend == other.dstBlend)
			&& (blendOp == other.blendOp)
			&& (srcBlendAlpha == other.srcBlendAlpha)
			&& (dstBlendAlpha == other.dstBlendAlpha)
			&& (blendOpAlpha == other.blendOpAlpha);
	}
	inline bool operator!=(const kBlend& other) {
		return (srcBlend != other.srcBlend)
			|| (dstBlend != other.dstBlend)
			|| (blendOp != other.blendOp)
			|| (srcBlendAlpha != other.srcBlendAlpha)
			|| (dstBlendAlpha != other.dstBlendAlpha)
			|| (blendOpAlpha != other.blendOpAlpha);
	}

	inline bool separateAlphaBlend() {
		return (srcBlendAlpha != srcBlend) || (dstBlendAlpha != dstBlend) || (blendOp != blendOpAlpha);
	}
};
